<?php
/**
 * @author Alejandro Gama <alejandro.gama@gmail.com>
 * @version 1.0
 * @package core
 * @subpackage config
 * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
 */
header( 'Content-Type: text/html; charset=UTF-8' );
//header('Content-Type: text/html; charset='.CHARSET,true,301);
include 'config.inc.php';
?>
<html>
    <head><title>Script de configuración</title></head>
    <body>
        <h3>Aplicación</h3>
        <table border="1">
            <tbody>
                <tr>
                    <th scope="row">DEFAULT_CLASS</th><td><?= DEFAULT_CLASS ?></td>
                </tr>
                <tr>
                    <th scope="row">DEFAULT_ID</th><td><?= DEFAULT_ID ?></td>
                </tr>
                <tr>
                    <th scope="row">CHARSET</th><td><?= CHARSET ?></td>
                </tr>
                <tr>
                    <th scope="row">SHM_SIZE</th><td><?= SHM_SIZE ?></td>
                </tr>
            </tbody>
        </table>
        <h3>Directorios</h3>
        <table border="1">
            <tbody>
                <tr>
                    <th scope="row">PATH</th><td><?= PATH ?></td>
                </tr>
                <tr>
                    <th scope="row">ROOT_PATH</th><td><?= ROOT_PATH ?></td>
                </tr>
                <tr>
                    <th scope="row">WEB FOLDER</th><td><?= FOLDER ?></td>
                </tr>
            </tbody>
        </table>
        <h3>Base de Datos</h3>
        <table border="1">
            <tbody>
                <tr>
                    <th scope="row">DB_HOST</th><td><?= DB_HOST ?></td>
                </tr>
                <tr>
                    <th scope="row">DB_USER</th><td><?= DB_USER ?></td>
                </tr>
                <tr>
                    <th scope="row">DB_DB</th><td><?= DB_DB ?></td>
                </tr>
                <tr>
                    <th scope="row">DB_CHARSET</th><td><?= DB_CHARSET ?></td>
                </tr>
            </tbody>
        </table>
        <h3>Cache</h3>
        <table border="1">
            <tbody>
                <tr>
                    <th scope="row">HTML_MEMCACHE_ENABLED</th><td><?= HTML_MEMCACHE_ENABLED ?></td>
                </tr>
                <tr>
                    <th scope="row">HTML_MEMCACHE_TIME</th><td><?= HTML_MEMCACHE_TIME ?></td>
                </tr>
                <tr>
                    <th scope="row">SMALL_SLOW_QUERIES</th><td><?= SMALL_SLOW_QUERIES ?></td>
                </tr>
                <tr>
                    <th scope="row">NODES_MEMCACHE_ENABLED</th><td><?= NODES_MEMCACHE_ENABLED ?></td>
                </tr>
                <tr>
                    <th scope="row">NODES_MEMCACHE_TIME</th><td><?= NODES_MEMCACHE_TIME ?></td>
                </tr>
                <tr>
                    <th scope="row">SOAP_CACHE</th><td><?= SOAP_CACHE ?></td>
                </tr>
            </tbody>
        </table>
        <h3>Debug</h3>
        <table border="1">
            <tbody>
                <tr>
                    <th scope="row">ROLLBACK_ERRORS</th><td><?= ROLLBACK_ERRORS ?></td>
                </tr>
                <tr>
                    <th scope="row">ERROR_REPORTING</th><td><?= error_reporting() ?></td>
                </tr>
            </tbody>
        </table>
        <?php
        set_time_limit( 120 );
        error_reporting( E_STRICT | E_ALL );
        require 'core/Config.class.php';

//TENGO QUE GUARDAR LA RUTA COMPLETA DE LOS ARCHIVOS

        Config::init(); //ahora tenemos en POLICY_NAMES y POLICY_IDS los valores antiguos


        $nodeIDS = Config::$POLICY_ID;
//OJO ESTO PROVOCA QUE TODAS LOS INDICES SE PIERDAN SI NO LOS GUARDO!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

        Config::resetMemory(); //reiniciamos la memoria por si hemos cambiado el tamaño
//Para que sea usable antes del PHP 5.0.3 dónde se permite que el primer parametro de is_subclass_of

        function is_subclass( $sClass, $sExpectedParentClass )
        {
            do
                if ( $sExpectedParentClass === $sClass ) return true;
            while ( false != ($sClass = get_parent_class( $sClass )) );
            return false;
        }

        $madres = array( );
        try {
            foreach ( Config::$PATH as $n => $p ) {
                $madre = get_parent_class( $n ); //en una clase sin clase madre que me devuelve? null?
                $madres[ $n ] = $madre;
            }
        } catch ( Exception $e ) {
            echo $e;
        }


        $arbol = array( );

        function buscarHijas( $clase, &$array )
        {
            global $madres;

            foreach ( $madres as $c => $madre ) {
                if ( $madre == $clase ) {
                    $array[ $c ] = array( );
                    buscarHijas( $c, $array[ $c ] );
                }
            }
        }

        foreach ( $madres as $c => $madre ) {
            if ( $madre === 'Node' ) {
                $arbol[ $c ] = array( );
                buscarHijas( $c, $arbol[ $c ] );
            }
        }
        ?>
        <h3>Árbol de Clases</h3>
        <pre>
            <?php
            var_dump( $arbol );
            ?>
        </pre>
        <?
        /*
          function __autoload($classname){
          if(!isset(Config::$PATH[$classname]))
          throw new Exception('No existe el archivo con nombre \''.$classname.'.class.php\'');

          require Config::$PATH[$classname];
          }
         */

        function buscarTemplates( $ruta )
        {
            global $templates;

            $files = array_diff( scandir( $ruta ), array( '.', '..' ) );

            foreach ( $files as $archivo ) {

                $ruta_archivo = $ruta . DIRECTORY_SEPARATOR . $archivo;

                $coincidencias = array( );
                if ( preg_match( '/^([^\.]+).([^\.]+)\.php$/', $archivo,
                                $coincidencias ) ) {


                    if ( $coincidencias[ 2 ] !== 'class' && isset( Config::$PATH[ $coincidencias[ 1 ] ] ) && is_subclass( $coincidencias[ 1 ],
                                    'Node' ) ) {

                        $clase = $coincidencias[ 1 ];

                        if ( isset( $templates[ $clase ] ) ) {

                            if ( isset( $templates[ $clase ][ $coincidencias[ 2 ] ] ) )
                                    throw new Exception( 'Existen dos plantillas con el mismo nombre:<ul><li>' . $templates[ $clase ][ $coincidencias[ 2 ] ] . '</li><li>' . $ruta_archivo . '</li></ul>' );

                            $templates[ $clase ][ $coincidencias[ 2 ] ] = $ruta_archivo;
                        }
                        else {
                            $templates[ $clase ] = array( );
                            $templates[ $clase ][ $coincidencias[ 2 ] ] = $ruta_archivo;
                        }
                    }
                } else if ( is_dir( $ruta_archivo ) )
                        buscarTemplates( $ruta_archivo );

                unset( $coincidencias, $ruta_archivo );
            }
        }

        $templates = array( );
        buscarTemplates( '.' );

//TENGO QUE HACER HEREDAR TODAS LAS PLANTILLAS
        function heredarTemplates( $arbol )
        {
            global $templates;

            foreach ( $arbol as $madre => $hijas ) {
                $nomhijas = array_keys( $hijas );

                if ( isset( $templates[ $madre ] ) ) {
                    //para cada uno de los stage y la ruta a la plantilla
                    foreach ( $templates[ $madre ] as $stage => $temp ) {

                        //para cada una de las clases hijas

                        foreach ( $nomhijas as $nom ) {
                            if ( !isset( $templates[ $nom ] ) )
                                    $templates[ $nom ] = array( );
                            if ( !isset( $templates[ $nom ][ $stage ] ) )
                                    $templates[ $nom ][ $stage ] = $temp;
                        }
                    }
                }

                heredarTemplates( $hijas );
            }
        }

        heredarTemplates( $arbol );



        Config::storeTemplates( $templates );

        ksort( $templates );
        ?>
        <h3>Plantillas de las clases Node</h3>
        <table border="1">
            <thead>
                <tr><th>Clase</th><th>Stage</th><th>Plantilla</th></tr>
            </thead>
            <tbody>
                <?php
                foreach ( $templates as $c => $temp ):
                    ?>
                    <tr><td rowspan="<?= (count( $temp ) + 1) ?>" valign="middle"><?= $c ?></td><td></td><td></td></tr>
                    <?php
                    foreach ( $temp as $stage => $path ):
                        ?>
                        <tr><td><?= $stage ?></td><td><?= $path ?></td></tr>
                    <?php endforeach; ?>
                <?php endforeach; ?>
            </tbody>
        </table>

        <?php
//ATENCION: POR RAZONES DE COMPATIBILIDAD CON MySQL en SQL Server debe estar todo en el mismo catalogo
//POR RAZONES DE COMPATIBILIDAD CON SQL Server vamos a poner el nombre del catalogo siempre

        $defaultschema = MyLink::$default->get_rows( Config::$helper->getDefaultSchemaSQL(),
                        true )->getField( 0 );
//si no existe el schema debería crearlo

        $tables = MyLink::$default->get_rows( Config::$helper->getTablesSQL(),
                        true )->toArray();
//puedo considerar que las tablas mssql estan formados por dos partes
//AQUI TENGO TABLES CON EL SCHEMA 

        $tablas = array( );
        foreach ( $tables as $t ) {

            if ( !isset( $tablas[ $t[ 0 ] ] ) ) $tablas[ $t[ 0 ] ] = array( );


            $tablas[ $t[ 0 ] ][ $t[ 1 ] ] = array( );

            $columnas = MyLink::$default->get_rows( Config::$helper->getColumnsSQL( $t[ 1 ],
                                    $t[ 0 ] ), true )->toArray();

            foreach ( $columnas as $c )
                    $tablas[ $t[ 0 ] ][ $t[ 1 ] ][ $c[ 0 ] ] = Config::$helper->isNumeric( $c[ 1 ] );
        }
        unset( $tables );
        ?>
        <h3>Tablas de la Base de Datos</h3>
        <table border="1">
            <thead>
                <tr><th>Esquema</th><th>Nombre</th><th>Columnas</th></tr>
            </thead>
            <tbody>
                <?php
                foreach ( $tablas as $schema => $tables ): $filas1 = 0;
                    ?>
                    <tr><td colspan="3"><?= $schema ?></td></tr>
                    <?php
                    foreach ( $tables as $name => $columns ): $filas2 = 0;
                        ?>
                        <tr><td>&nbsp;</td><td  colspan="2"><?= $name ?></td></tr>
                        <?php
                        foreach ( $columns as $col => $isNum ): $filas1++;
                            $filas2++;
                            ?>
                    </td><td>&nbsp;</td><td>&nbsp;</td><td><?= $col . ($isNum ? '*' : '') ?></td></tr>
        <?php endforeach; ?>


    <?php endforeach; ?>

<?php endforeach; ?>
</tbody>
<tfoot>
    <tr><td colspan="3">* columnas numéricas</td></tr>
</tfoot>
</table>
<?
$engines = array( );
if ( isset( $tablas[ 'information_schema' ][ 'engines' ] ) )
        $engines = MyLink::$default->get_rows( Config::$helper->getStorageEnginesSQL(),
                    true )->toArray();

//si me encuentro en situación de tener varios esquemas dentro de la base de datos tendría que crear un esquema con el mismo nombre que la base de datos

if ( !isset( $tablas[ $defaultschema ][ 'security_edges' ] ) ) {
    $sql = 'CREATE TABLE ' . Config::$helper->escapeIdentifier( $defaultschema ) . '.security_edges(
    Id int ' . Config::$helper->autoincrement() . ' NOT NULL ,
    VerticeInicio varbinary(50) NOT NULL,
    VerticeFin varbinary(50) NOT NULL,
    IdAristaEntrada int NULL,
    IdAristaSalida int NULL,
    IdAristaCausante int NULL,
    Implicita char (1) NOT NULL,
    Contexto varbinary(36) NOT NULL,
    PRIMARY KEY  (Id)
    )' . (in_array( 'ndbcluster',
                    $engines ) ? ' ENGINE=ndbcluster' : '');

    echo $sql . '<br />';
    MyLink::$default->execute( $sql );
}

if ( !isset( $tablas[ $defaultschema ][ 'security_privileges' ] ) ) {
    'CREATE TABLE ' . Config::$helper->escapeIdentifier( $defaultschema ) . '.security_privileges (
    Id int ' . Config::$helper->autoincrement() . ' NOT NULL ,
    Rol varbinary(50) NOT NULL,
    Recurso varbinary(50) NOT NULL,
    Clase varbinary(100) NOT NULL,
    IdPrivilegioCausante int NULL,
    IdAristaHerencia int NOT NULL,
    Implicita char (1) NOT NULL,
    PRIMARY KEY  (Id)
    )' . (in_array( 'ndbcluster',
                    $engines ) ? ' ENGINE=ndbcluster' : '');

    MyLink::$default->execute( $sql );
}

if ( !isset( $tablas[ $defaultschema ][ 'security_roles' ] ) ) {
    $sql = 'CREATE TABLE ' . Config::$helper->escapeIdentifier( $defaultschema ) . '.security_roles (
    Usuario int NOT NULL,
    Rol varbinary(50) NOT NULL,
    RolId int NOT NULL,
    PRIMARY KEY  (Usuario,Rol,RolId)
    )' . (in_array( 'ndbcluster',
                    $engines ) ? ' ENGINE=ndbcluster' : '');

    MyLink::$default->execute( $sql );
}

if ( !isset( $tablas[ $defaultschema ][ 'security_cache_groups' ] ) ) {
    $sql = 'CREATE TABLE ' . Config::$helper->escapeIdentifier( $defaultschema ) . '.security_cache_groups (
    Id int NOT NULL ' . Config::$helper->autoincrement() . ',
    RolStr varbinary(400) NOT NULL,
    FullRolStr varbinary(400) NOT NULL,
    md5 varchar(32) NOT NULL,
    PRIMARY KEY  (Id)
    )' . (in_array( 'ndbcluster',
                    $engines ) ? ' ENGINE=ndbcluster' : '');

    MyLink::$default->execute( $sql );
}

//esto igual es más rapido en un fichero??
if ( !isset( $tablas[ $defaultschema ][ 'security_cache_resources' ] ) ) {
    $sql = 'CREATE TABLE ' . Config::$helper->escapeIdentifier( $defaultschema ) . '.security_cache_resources(
    grupo int NOT NULL,
    nodo tinyint NOT NULL,
    idNumerico varbinary(127) NOT NULL,
    ' . Config::$helper->escapeIdentifier( 'select' ) . ' varbinary(7000) NOT NULL,
    ' . Config::$helper->escapeIdentifier( 'super_select' ) . ' varbinary(1000) NOT NULL,
    roles varbinary(400) NOT NULL,
    PRIMARY KEY  (grupo,nodo)
    )' . (in_array( 'ndbcluster',
                    $engines ) ? ' ENGINE=ndbcluster' : ''); //OJO!!!! se roles lo pongo como binary no voy a poder hacer busquedas 

    MyLink::$default->execute( $sql );
} //    indiceClase varbinary(1000) NOT NULL, Utilizamos IF en mysql o CASE en MS SQL server en el primer parametro, para que devuelva el nombre de la clase a utilizar en cada fila

if ( !isset( $tablas[ $defaultschema ][ 'security_users_accesses' ] ) ) {
    $sql = 'CREATE TABLE ' . Config::$helper->escapeIdentifier( $defaultschema ) . '.security_users_accesses  (
    usuario int NOT NULL,
    ip varchar(39) NOT NULL,
    sid varchar(32) NOT NULL,
    last datetime2 NOT NULL,
    suspect char(1) NOT NULL,
    )' . (in_array( 'ndbcluster',
                    $engines ) ? ' ENGINE=ndbcluster' : '');

    MyLink::$default->execute( $sql );
}

//SI EXISTEN LAS TABLAS SIGUIENTES DEBEN SER BORRADAS
$sql = 'TRUNCATE TABLE ' . Config::$helper->escapeIdentifier( $defaultschema ) . '.security_cache_resources';
MyLink::$default->execute( $sql );
$sql = 'TRUNCATE TABLE ' . Config::$helper->escapeIdentifier( $defaultschema ) . '.security_cache_blocks';
MyLink::$default->execute( $sql );
///NEVER NEVER NEVER NEVER NEVER NEVER NEVER NEVER NEVER NEVERmysql_query('TRUNCATE TABLE security_cache_groups'); //si o no?

unset( $nombre, $colsRnums );



//debería copiar el htaccess del core
if ( !file_exists( 'config/.htaccess' ) ) {
    $htaccess = "Options -Indexes\nDeny from all";

    file_put_contents( 'config/.htaccess', $htaccess );
    //file_put_contents('cache/.htaccess',$htaccess);
    //en html tb tendría que copiarlo y en algún otro sitio más
}




$interfaces = array( );

//OJO
function buscarInterface( $ruta )
{
    global $interfaces, $nodeIDS, $min;

    $files = array_diff( scandir( $ruta ), array( '.', '..' ) );

    foreach ( $files as $archivo ) {

        $ruta_archivo = $ruta . DIRECTORY_SEPARATOR . $archivo;


        if ( substr( $archivo, -4 ) === '.xml' ) {
            $clase = substr( $archivo, 0, -4 );


            if ( isset( $interfaces[ $clase ] ) ) {
                throw new Exception( 'Existen dos XML para la misma politica ' . $clase );
            } else {

                if ( isset( $nodeIDS[ $clase ] ) )
                        Config::$POLICY_NAME[ $nodeIDS[ $clase ] ] = $clase;
                else {

                    while ( in_array( $min, $nodeIDS ) )
                        $min++;
                    Config::$POLICY_NAME[ $min ] = $clase;
                    $min++;
                }


                $interfaces[ $clase ] = $ruta_archivo;
            }
        } else if ( is_dir( $ruta_archivo ) ) buscarInterface( $ruta_archivo );

        unset( $coincidencias, $ruta_archivo );
    }
}

$min = 0;
buscarInterface( './policies' );
foreach ( $interfaces as $class => $path )
        $interfaces[ $class ] = obtenerInterface( $class, $path );

Config::storeNames( Config::$POLICY_NAME );
//recorriendo el array árbol recursivamente
?>


<h3>Policy e ID</h3>
<pre>
    <?php
    var_dump( Config::$POLICY_ID );
    ?>
</pre>
<?php
$nodeTypes = array( );
foreach ( $interfaces as $class => $inter ) {
    $nodeTypes[ Config::$POLICY_ID[ $class ] ] = $inter[ 0 ];
    Config::storePolicy( Config::$POLICY_ID[ $class ], $inter[ 1 ] );
}

Config::storeTypes( $nodeTypes );
ksort( $interfaces );
?>
<h3>Interfaces de las clases Node</h3>
<table border="1">
    <thead>
        <tr><th>Clase</th><th>Policy</th></tr>
    </thead>
    <tbody>
        <?php
        foreach ( $interfaces as $class => $inter ):
            ?>
            <tr>
                <td><?= $class ?></td>
                <td><pre><?php var_dump( $inter[ 1 ] ) ?></pre></td>
            </tr>
        <?php endforeach; ?>
    </tbody>
</table>
<?php

//$get y $post deben estar en los HTMLBlock
function obtenerInterface( $class, $path )
{
    global $tablas, $defaultschema;

    $xml = simplexml_load_file( $path );


    $type = null;
    $config = null;

    if ( isset( $xml->select ) ) { //Es un ResourceNode
        $type = Node::RESOURCE;
        $config = array( );

        $select = Config::$helper->exploreSELECT( ( string ) $xml->select[ 'sql' ] );

        //ahora asociamos lo extraido de la select con lo que sabemos de la base de datos
        //primero podría asignar cada una de las tablas del $select a una tabla de las $tablas;
        //todas deben estar en el mismo catalogo, por eso ya no lo compruebo
        foreach ( $select[ 'tables' ] as $index => $t ) {
            foreach ( $tablas as $schemaname => $tables ) {

                if ( $schemaname == $t[ 'schema' ] || $t[ 'schema' ] == '' && $schemaname == $defaultschema ) {
                    foreach ( $tables as $tablename => $columns ) {

                        if ( $t[ 'table' ] == $tablename ) {
                            $select[ 'tables' ][ $index ][ 'columns' ] = $columns; //$t['columns']=$columns;
                            continue 3;
                        }
                    }
                }
            }
            //si llega aqui es que no ha encontrado la tabla correcta con el anterior criterio
            if ( $t[ 'schema' ] == '' ) {
                foreach ( $tablas as $schemaname => $tables ) {
                    foreach ( $tables as $tablename => $columns ) {

                        if ( $t[ 'table' ] == $tablename ) {
                            $select[ 'tables' ][ $index ][ 'schema' ] = $schemaname;
                            $select[ 'tables' ][ $index ][ 'columns' ] = $columns; //$t['columns']=$columns;
                            continue 3;
                        }
                    }
                }
            }
        }


        //ahora tengo que ver de cuales de las tablas del from es cada uno de los campos

        foreach ( $select[ 'fields' ] as $index => $field ) {

            //si tiene schema tengo que tener una tabla id
            if ( !empty( $field[ 'schema' ] ) ) {

                foreach ( $select[ 'tables' ] as $t ) {

                    //Si existe field['schema'] tiene que existir table
                    if ( $field[ 'schema' ] == $t[ 'schema' ] && $t[ 'name' ] == $field[ 'table' ] ) {
                        foreach ( $t[ 'columns' ] as $c => $numeric ) {
                            if ( $c == $field[ 'field' ] ) {
                                $select[ 'fields' ][ $index ][ 'numeric' ] = $numeric;
                                continue 3;
                            }
                        }
                    }
                }
            } else if ( !empty( $field[ 'table' ] ) ) { //esto puede ser un alias para ello comprobamos primero esto, si hay alguna tabla con este alias
                $found = false;
                foreach ( $select[ 'tables' ] as $t )
                        if ( isset( $t[ 'alias' ] ) && $field[ 'table' ] == $t[ 'alias' ] ) {
                        foreach ( $t[ 'columns' ] as $c => $numeric )
                                if ( $c == $field[ 'field' ] ) {
                                $found = true;
                                $select[ 'fields' ][ $index ][ 'numeric' ] = $numeric;
                                continue 3;
                            }
                    }

                if ( !$found )
                        foreach ( $select[ 'tables' ] as $t )
                            if ( $field[ 'table' ] == $t[ 'table' ] ) {
                            foreach ( $t[ 'columns' ] as $c => $numeric )
                                    if ( $c == $field[ 'field' ] ) {
                                    $select[ 'fields' ][ $index ][ 'numeric' ] = $numeric;
                                    continue 3;
                                }
                        }
            } else if ( !empty( $field[ 'field' ] ) ) {
                foreach ( $select[ 'tables' ] as $t )
                        foreach ( $t[ 'columns' ] as $c => $numeric ) {
                        if ( $c == $field[ 'field' ] ) {
                            $select[ 'fields' ][ $index ][ 'numeric' ] = $numeric;
                            continue 3;
                        }
                    }
            }
        }


        $config[ 'base' ] = $select[ 'reserved' ];
        $config[ 'from' ] = $select[ 'from' ];
        $config[ 'where' ] = $select[ 'where' ];
        $config[ 'end' ] = $select[ 'group by' ];


        $config[ 'isNumeric' ] = null;
        $config[ 'idField' ] = array( );

        foreach ( $select[ 'fields' ] as $field )
                if ( isset( $field[ 'alias' ] ) ) {
                $c = array( );


                if ( $field[ 'alias' ] === 'id' ) {

                    if ( empty( $field[ 'field_org' ] ) )
                            $config[ 'idField' ][ $field[ 'alias' ] ] = $field[ 'numeric' ];
                    else
                            $config[ 'idField' ][ $field[ 'field_org' ] ] = $field[ 'numeric' ];


                    // $config['isNumeric']=$field['numeric'];

                    break;
                }
                else if ( preg_match( '/^id\[(\d+)\]$/', $field[ 'alias' ], $c ) ) {

                    if ( !is_array( $config[ 'isNumeric' ] ) )
                            $config[ 'isNumeric' ] = array( );

                    //if(!is_array($config['idField']))
                    //    $config['idField']=array();

                    if ( empty( $field[ 'field_org' ] ) )
                            $config[ 'idField' ][ $field[ 'alias' ] ] = $field[ 'numeric' ];
                    else
                            $config[ 'idField' ][ $field[ 'field_org' ] ] = $field[ 'numeric' ];

                    //$config['idField'][$c[0]]=$field['numeric'];
                    // $config['isNumeric'][$c[1]]=$field['numeric'];
                }
            }

        if ( $config[ 'isNumeric' ] == null ) {
            foreach ( $select[ 'fields' ] as $field ) {
                if ( $field[ 'field' ] === 'id' ) {
                    //   $config['isNumeric']=$field['numeric'];

                    if ( empty( $field[ 'field_org' ] ) )
                            $config[ 'idField' ][ $field[ 'alias' ] ] = $field[ 'numeric' ];
                    else
                            $config[ 'idField' ][ $field[ 'field_org' ] ] = $field[ 'numeric' ];
                    break;
                }
            }
        }

        //ES cierto, si tienen como alias id porque guardo el resto??????????????????????????????????????????????????????????????
        //puedo refererirme a ellos por id siempre!!

        if ( $config[ 'isNumeric' ] == null ) {
            echo '<pre>';
            var_dump( $select );
            echo '</pre>';
            throw new Exception( 'Falta campo con alias id:' . $class );
        }


        $config[ 'fields' ] = array( );
        $config[ 'classes' ] = array( ); //puedo transformar este array en un array indexado por el nombre de la clase y con una sentencia sql como dato
        $config[ 'resourceField' ] = array( );


        if ( isset( $xml->policy ) ) {

            if ( isset( $xml->policy->resource[ 1 ] ) )
                    foreach ( $xml->policy->resource as $r )
                        $config[ 'resourceField' ][ ] = array( ( string ) $r[ 'tag' ],
                        isset( $r[ 'id' ] ) ? ( string ) $r[ 'id' ] : null );

            else if ( isset( $xml->policy->resource ) )
                    $config[ 'resourceField' ][ ] = array( ( string ) $xml->policy->resource[ 'tag' ],
                    isset( $xml->policy->resource[ 'id' ] ) ? ( string ) $xml->policy->resource[ 'id' ] : null );

            if ( isset( $xml->policy->use[ 1 ] ) ) {
                foreach ( $xml->policy->use as $u ) {

                    if ( !isset( $config[ 'fields' ][ ( string ) $u[ 'class' ] ] ) ) {

                        $campos = array( );
                        foreach ( $select[ 'fields' ] as $field ) {

                            $campo = $field[ 'alias' ];
                            if ( empty( $campo ) ) $campo = $field[ 'field' ];

                            if ( preg_match( '/^id\[(\d+)\]$/', $campo ) )//estos seguro que no los tiene
                                    $campos[ $campo ] = $field[ 'field_org' ];

                            else {
                                try {
                                    $ref = new ReflectionProperty( ( string ) $u[ 'class' ],
                                            $campo );
                                    $campos[ $campo ] = $field[ 'field_org' ];
                                } catch ( Exception $ex ) {
                                    //if($class=='UsuarioAdminColegioNode'){
                                    echo 'La clase ' . $u[ 'class' ] . ' no posee la propiedad ' . $campo . ' (' . $class . ')<br />';
                                    //}
                                    //do nothing
                                    /*
                                      echo 'La clase '.$u['class'].' no posee la propiedad '.$alias.'<br />';
                                     */
                                }
                            }
                        }

                        $config[ 'fields' ][ ( string ) $u[ 'class' ] ] = $campos;
                    }

                    $sqk = '';
                    if ( isset( $u->sql ) )
                            $sqk = ( string ) $u->sql[ 'where' ];
                    $config[ 'classes' ][ ( string ) $u[ 'class' ] ] = $sqk;
                    //$config['classes'][]=(string) $u['class'];
                }
            }
            else if ( isset( $xml->policy->use ) ) {

                if ( !isset( $config[ 'fields' ][ ( string ) $xml->policy->use[ 'class' ] ] ) ) {
                    $campos = array( );
                    //Aqui tengo que establecer los campos a los que tiene acceso
                    foreach ( $select[ 'fields' ] as $field ) {

                        $campo = $field[ 'alias' ];
                        if ( empty( $campo ) ) $campo = $field[ 'field' ];

                        if ( preg_match( '/^id\[(\d+)\]$/', $campo ) ) //estos seguro que no los tiene
                                $campos[ $campo ] = $field[ 'field_org' ];
                        else {
                            try {
                                $ref = new ReflectionProperty( ( string ) $xml->policy->use[ 'class' ],
                                        $campo );
                                $campos[ $campo ] = $field[ 'field_org' ];
                            } catch ( Exception $ex ) {
                                echo 'La clase ' . $xml->policy->use[ 'class' ] . ' no posee la propiedad ' . $campo . ' (' . $class . ')<br />';
                            }
                        }
                    }

                    //Aqui tb podría utilizar el id de la clase
                    $config[ 'fields' ][ ( string ) $xml->policy->use[ 'class' ] ] = $campos;
                }

                //tengo que incorporar todos los where en una cadena concatenada con ANDs y partirla por IN USER_RESOURCES
                //y todos los roles tb
                $sqk = '';
                if ( isset( $xml->policy->use->sql ) )
                        $sqk = ( string ) $xml->policy->use->sql[ 'where' ];
                $config[ 'classes' ][ ( string ) $xml->policy->use[ 'class' ] ] = $sqk;
                //$config['classes'][]=(string) $xml->policy->use['class'];
            }
        }

        //OJO IGUAL ME PONEN VARIOS WHERE EN EL USE, ESOS HAY QUE CONCATENARLOS CON UN AND Y ENCERRANDO ENTRE PARENTESIS CADA UNO DE ELLOS
        //LUEGO SE HACE EL EXPLODE
        //tengo que escojer para cada clase los campos que extraer
        //OJO... poruqe en teoría tienen que coincidir con las propiedades de unobjeto y no puede haber dos con el mismo nombre
        $config[ 'selectData' ] = '';

        $campos = array( );

        foreach ( $config[ 'classes' ] as $c => $zql ) {
            foreach ( $config[ 'fields' ][ $c ] as $alias => $nombre )
                    if ( !in_array( $alias, $campos ) ) {
                    if ( $alias != $nombre )
                            $config[ 'selectData' ].=', ' . $nombre . ' AS ' . Config::$helper->escapeIdentifier( $alias );
                    else $config[ 'selectData' ].=', ' . $nombre;

                    $campos[ ] = $alias;
                }
        }
    }
    else if ( isset( $xml->policy ) && isset( $xml->policy->use ) ) {
        $type = Node::BLOCK;

        $config = array( );

        if ( isset( $xml->policy->use[ 1 ] ) ) {
            foreach ( $xml->policy->use as $h ) {

                $roles = array( );
                if ( isset( $h->rol[ 1 ] ) ) {
                    foreach ( $h->rol as $w )
                            $roles[ ] = array( ( string ) $w[ 'tag' ], isset( $w[ 'id' ] ) ? ( string ) $w[ 'id' ] : 0 );
                } else if ( isset( $h->rol ) )
                        $roles[ ] = array( ( string ) $h->rol[ 'tag' ], isset( $h->rol[ 'id' ] ) ? ( string ) $h->rol[ 'id' ] : 0 );;

                $config[ ] = array( 'class' => ( string ) $h[ 'class' ], 'roles' => $roles );
            }
        }
        else if ( isset( $xml->policy->use ) ) {
            $roles = array( );

            if ( isset( $xml->policy->use->rol[ 1 ] ) ) {
                foreach ( $xml->policy->use->rol as $w )
                        $roles[ ] = array( ( string ) $w[ 'tag' ], isset( $w[ 'id' ] ) ? ( string ) $w[ 'id' ] : 0 );
            } else if ( isset( $xml->policy->use->rol ) )
                    $roles[ ] = array( ( string ) $xml->policy->use->rol[ 'tag' ],
                    isset( $xml->policy->use->rol[ 'id' ] ) ? ( string ) $xml->policy->use->rol[ 'tag' ] : 0 );

            $config[ ] = array( 'class' => ( string ) $xml->policy->use[ 'class' ],
                'roles' => $roles );
        }
    }


    return array( $type, $config );
}
?>
</body>
</html>
<?php
//ob_end_flush();
?>